#传统方式的使用
import os

import dotenv
from langchain_classic.agents import AgentType, initialize_agent
from langchain_community.tools import TavilySearchResults
from langchain_core.tools import StructuredTool, Tool
from langchain_openai import ChatOpenAI

#使用Tavily搜索内容 ，注册地址https://app.tavily.com/

"""
太高的langchain版本会报错
"""
dotenv.load_dotenv()

#获取Tavily搜索工具实例
search = TavilySearchResults(max_results=5)   # max_results: 最多返回多少个结果

"""
技巧： 查看TavilySearchResults的远吗，可以发现此类的父类是BaseTool，那么此类已经是工具类，不需要再使用StructuredTool或tool包装成工具。
initialize_agent里可以吧search直接给tools属性
"""

#获取一个搜索的工具
#方式1
# search_tool = StructuredTool.from_function(
#     func=search.run,
#     name="search_tavily",
#     description="使用Tavily进行搜索互联网上的信息,并将结果返回给用户",
# )

#方式2 使用tool
search_tool = Tool(
    name="search_tavily",
    description="使用Tavily进行搜索互联网上的信息,并将结果返回给用户",
    func=search.run,
)

#获取大语言模型
chat_model = ChatOpenAI(
        model=os.getenv("MODEL_NAME")
        , base_url=os.getenv("BASE_URL")
        , api_key=os.getenv("API_KEY")
        , temperature=0.8  # 精确度
        , max_tokens=1024  # 回答长度
    )

#获取Agent实例
agent = AgentType.OPENAI_FUNCTIONS

#获取AgentExecutor实例
agent_executor = initialize_agent(
    tools=[search_tool]
    , llm=chat_model
    , agent=agent
    , verbose=True #显示运行过程
)

#调用invoke()得到响应
response = agent_executor.invoke("今天的北京天气如何")
print(response)